#include <vector>
#include <queue>
#include "sched_rr.h"
#include "basesched.h"
#include <iostream>

using namespace std;

SchedRR::SchedRR(vector<int> argn) {
	// Round robin recibe la cantidad de cores y sus cpu_quantum por parámetro
	// inicializo los vectores quantum y quantumRestante con los valores que recibo
	for(int i = 1; i <= argn[0]; ++i) {
		quantum.push_back(argn[i]);
		quantumRestante.push_back(argn[i]);
	}
}

SchedRR::~SchedRR() {

}

void SchedRR::load(int pid) {
	tasksInStandBy.push(pid);
}

void SchedRR::unblock(int pid) {
	tasksInStandBy.push(pid);
}

int SchedRR::tick(int cpu, const enum Motivo m) {
	int taskToExecute = IDLE_TASK;
	// si la tarea termino o si la actual es la tarea IDLE
	if(m == EXIT || current_pid(cpu) == IDLE_TASK) {
		if(!tasksInStandBy.empty()) {
			taskToExecute = tasksInStandBy.front();
			tasksInStandBy.pop();
		}
		quantumRestante[cpu] = quantum[cpu];

	} else if(m == TICK) {
		// Si se termino el quantum
		if(quantumRestante[cpu] == 0) {
			// Si hay otra tarea, cambio a esa
			if(!tasksInStandBy.empty()) {
				taskToExecute = tasksInStandBy.front();
				tasksInStandBy.pop();
				tasksInStandBy.push(current_pid(cpu));
			} else {
			// Si no hay otra tarea, vuelvo a ejecutar la actual
				taskToExecute = current_pid(cpu);
			}
			quantumRestante[cpu] = quantum[cpu];
		} else {
			quantumRestante[cpu]--;
			taskToExecute = current_pid(cpu);
		}
	} else {
		if(!tasksInStandBy.empty()) {
			taskToExecute = tasksInStandBy.front();
			tasksInStandBy.pop();
		}
	}
	return taskToExecute;
}
